home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / ui_serverinfo.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  6.0 KB  |  253 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. #include "ui_local.h"
  4.  
  5. #define SERVERINFO_FRAMEL    "menu/art/frame2_l"
  6. #define SERVERINFO_FRAMER    "menu/art/frame1_r"
  7. #define SERVERINFO_BACK0    "menu/art/back_0"
  8. #define SERVERINFO_BACK1    "menu/art/back_1"
  9.  
  10. static char* serverinfo_artlist[] =
  11. {
  12.     SERVERINFO_FRAMEL,    
  13.     SERVERINFO_FRAMER,
  14.     SERVERINFO_BACK0,
  15.     SERVERINFO_BACK1,
  16.     NULL
  17. };
  18.  
  19. #define ID_ADD     100
  20. #define ID_BACK     101
  21.  
  22. typedef struct
  23. {
  24.     menuframework_s    menu;
  25.     menutext_s        banner;
  26.     menubitmap_s    framel;
  27.     menubitmap_s    framer;
  28.     menubitmap_s    back;
  29.     menutext_s        add;
  30.     char            info[MAX_INFO_STRING];
  31.     int                numlines;
  32. } serverinfo_t;
  33.  
  34. static serverinfo_t    s_serverinfo;
  35.  
  36.  
  37. /*
  38. =================
  39. Favorites_Add
  40.  
  41. Add current server to favorites
  42. =================
  43. */
  44. void Favorites_Add( void )
  45. {
  46.     char    adrstr[128];
  47.     char    serverbuff[128];
  48.     int        i;
  49.     int        best;
  50.  
  51.     trap_Cvar_VariableStringBuffer( "cl_currentServerAddress", serverbuff, sizeof(serverbuff) );
  52.     if (!serverbuff[0])
  53.         return;
  54.  
  55.     best = 0;
  56.     for (i=0; i<MAX_FAVORITESERVERS; i++)
  57.     {
  58.         trap_Cvar_VariableStringBuffer( va("server%d",i+1), adrstr, sizeof(adrstr) );
  59.         if (!Q_stricmp(serverbuff,adrstr))
  60.         {
  61.             // already in list
  62.             return;
  63.         }
  64.         
  65.         // use first empty or non-numeric available slot
  66.         if ((adrstr[0]  < '0' || adrstr[0] > '9' ) && !best)
  67.             best = i+1;
  68.     }
  69.  
  70.     if (best)
  71.         trap_Cvar_Set( va("server%d",best), serverbuff);
  72. }
  73.  
  74.  
  75. /*
  76. =================
  77. ServerInfo_Event
  78. =================
  79. */
  80. static void ServerInfo_Event( void* ptr, int event )
  81. {
  82.     switch (((menucommon_s*)ptr)->id)
  83.     {
  84.         case ID_ADD:
  85.             if (event != QM_ACTIVATED)
  86.                 break;
  87.         
  88.             Favorites_Add();
  89.             UI_PopMenu();
  90.             break;
  91.  
  92.         case ID_BACK:
  93.             if (event != QM_ACTIVATED)
  94.                 break;
  95.  
  96.             UI_PopMenu();
  97.             break;
  98.     }
  99. }
  100.  
  101. /*
  102. =================
  103. ServerInfo_MenuDraw
  104. =================
  105. */
  106. static void ServerInfo_MenuDraw( void )
  107. {
  108.     const char        *s;
  109.     char            key[MAX_INFO_KEY];
  110.     char            value[MAX_INFO_VALUE];
  111.     int                y;
  112.  
  113.     y = SCREEN_HEIGHT/2 - s_serverinfo.numlines*(SMALLCHAR_HEIGHT)/2 - 20;
  114.     s = s_serverinfo.info;
  115.     while ( s ) {
  116.         Info_NextPair( &s, key, value );
  117.         if ( !key[0] ) {
  118.             break;
  119.         }
  120.  
  121.         Q_strcat( key, MAX_INFO_KEY, ":" ); 
  122.  
  123.         UI_DrawString(SCREEN_WIDTH*0.50 - 8,y,key,UI_RIGHT|UI_SMALLFONT,color_red);
  124.         UI_DrawString(SCREEN_WIDTH*0.50 + 8,y,value,UI_LEFT|UI_SMALLFONT,text_color_normal);
  125.  
  126.         y += SMALLCHAR_HEIGHT;
  127.     }
  128.  
  129.     Menu_Draw( &s_serverinfo.menu );
  130. }
  131.  
  132. /*
  133. =================
  134. ServerInfo_MenuKey
  135. =================
  136. */
  137. static sfxHandle_t ServerInfo_MenuKey( int key )
  138. {
  139.     return ( Menu_DefaultKey( &s_serverinfo.menu, key ) );
  140. }
  141.  
  142. /*
  143. =================
  144. ServerInfo_Cache
  145. =================
  146. */
  147. void ServerInfo_Cache( void )
  148. {
  149.     int    i;
  150.  
  151.     // touch all our pics
  152.     for (i=0; ;i++)
  153.     {
  154.         if (!serverinfo_artlist[i])
  155.             break;
  156.         trap_R_RegisterShaderNoMip(serverinfo_artlist[i]);
  157.     }
  158. }
  159.  
  160. /*
  161. =================
  162. UI_ServerInfoMenu
  163. =================
  164. */
  165. void UI_ServerInfoMenu( void )
  166. {
  167.     const char        *s;
  168.     char            key[MAX_INFO_KEY];
  169.     char            value[MAX_INFO_VALUE];
  170.  
  171.     // zero set all our globals
  172.     memset( &s_serverinfo, 0 ,sizeof(serverinfo_t) );
  173.  
  174.     ServerInfo_Cache();
  175.  
  176.     s_serverinfo.menu.draw       = ServerInfo_MenuDraw;
  177.     s_serverinfo.menu.key        = ServerInfo_MenuKey;
  178.     s_serverinfo.menu.wrapAround = qtrue;
  179.     s_serverinfo.menu.fullscreen = qtrue;
  180.  
  181.     s_serverinfo.banner.generic.type  = MTYPE_BTEXT;
  182.     s_serverinfo.banner.generic.x      = 320;
  183.     s_serverinfo.banner.generic.y      = 16;
  184.     s_serverinfo.banner.string          = "SERVER INFO";
  185.     s_serverinfo.banner.color          = color_white;
  186.     s_serverinfo.banner.style          = UI_CENTER;
  187.  
  188.     s_serverinfo.framel.generic.type  = MTYPE_BITMAP;
  189.     s_serverinfo.framel.generic.name  = SERVERINFO_FRAMEL;
  190.     s_serverinfo.framel.generic.flags = QMF_INACTIVE;
  191.     s_serverinfo.framel.generic.x      = 0;  
  192.     s_serverinfo.framel.generic.y      = 78;
  193.     s_serverinfo.framel.width            = 256;
  194.     s_serverinfo.framel.height        = 329;
  195.  
  196.     s_serverinfo.framer.generic.type  = MTYPE_BITMAP;
  197.     s_serverinfo.framer.generic.name  = SERVERINFO_FRAMER;
  198.     s_serverinfo.framer.generic.flags = QMF_INACTIVE;
  199.     s_serverinfo.framer.generic.x      = 376;
  200.     s_serverinfo.framer.generic.y      = 76;
  201.     s_serverinfo.framer.width            = 256;
  202.     s_serverinfo.framer.height        = 334;
  203.  
  204.     s_serverinfo.add.generic.type      = MTYPE_PTEXT;
  205.     s_serverinfo.add.generic.flags    = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
  206.     s_serverinfo.add.generic.callback = ServerInfo_Event;
  207.     s_serverinfo.add.generic.id          = ID_ADD;
  208.     s_serverinfo.add.generic.x          = 320;
  209.     s_serverinfo.add.generic.y          = 371;
  210.     s_serverinfo.add.string            = "ADD TO FAVORITES";
  211.     s_serverinfo.add.style            = UI_CENTER|UI_SMALLFONT;
  212.     s_serverinfo.add.color              =    color_red;
  213.     if( trap_Cvar_VariableValue( "sv_running" ) ) {
  214.         s_serverinfo.add.generic.flags |= QMF_GRAYED;
  215.     }
  216.  
  217.     s_serverinfo.back.generic.type       = MTYPE_BITMAP;
  218.     s_serverinfo.back.generic.name     = SERVERINFO_BACK0;
  219.     s_serverinfo.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  220.     s_serverinfo.back.generic.callback = ServerInfo_Event;
  221.     s_serverinfo.back.generic.id       = ID_BACK;
  222.     s_serverinfo.back.generic.x           = 0;
  223.     s_serverinfo.back.generic.y           = 480-64;
  224.     s_serverinfo.back.width             = 128;
  225.     s_serverinfo.back.height             = 64;
  226.     s_serverinfo.back.focuspic         = SERVERINFO_BACK1;
  227.  
  228.     trap_GetConfigString( CS_SERVERINFO, s_serverinfo.info, MAX_INFO_STRING );
  229.  
  230.     s_serverinfo.numlines = 0;
  231.     s = s_serverinfo.info;
  232.     while ( s ) {
  233.         Info_NextPair( &s, key, value );
  234.         if ( !key[0] ) {
  235.             break;
  236.         }
  237.         s_serverinfo.numlines++;
  238.     }
  239.  
  240.     if (s_serverinfo.numlines > 16)
  241.         s_serverinfo.numlines = 16;
  242.  
  243.     Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.banner );
  244.     Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.framel );
  245.     Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.framer );
  246.     Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.add );
  247.     Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.back );
  248.  
  249.     UI_PushMenu( &s_serverinfo.menu );
  250. }
  251.  
  252.  
  253.